export function compareVersion(v1, v2) {
	v1 = v1.split('.')
	v2 = v2.split('.')
	const len = Math.max(v1.length, v2.length)
	while (v1.length < len) {
		v1.push('0')
	}
	while (v2.length < len) {
		v2.push('0')
	}
	for (let i = 0; i < len; i++) {
		const num1 = parseInt(v1[i], 10)
		const num2 = parseInt(v2[i], 10)

		if (num1 > num2) {
			return 1
		} else if (num1 < num2) {
			return -1
		}
	}
	return 0
}

function gte(version) {
	let { SDKVersion } = uni.getSystemInfoSync()
	// #ifdef MP-ALIPAY
	SDKVersion = my.SDKVersion
	// #endif
	return compareVersion(SDKVersion, version) >= 0
}

export function canIUseCanvas2d() {
	// #ifdef MP-WEIXIN
	return gte('2.9.0')
	// #endif
	// #ifdef MP-ALIPAY
	return gte('2.7.0')
	// #endif
	// #ifdef MP-TOUTIAO
	return gte('1.78.0')
	// #endif
	return false
}

export const wrapEvent = (e) => {
	if (!e) return
	if (!e.preventDefault) {
		e.preventDefault = function () {}
	}
	return e
}

export const requestAnimationFrame = (cb) => {
	setTimeout(cb, 30)
}

/**
 * base64转路径
 * @param {Object} base64
 */
export function base64ToPath(base64) {
	const [, format, bodyData] =
		/data:image\/(\w+);base64,(.*)/.exec(base64) || []
	return new Promise((resolve, reject) => {
		// #ifdef MP
		const fs = uni.getFileSystemManager()
		//自定义文件名
		if (!format) {
			reject(new Error('ERROR_BASE64SRC_PARSE'))
		}
		const time = new Date().getTime()
		const filePath = `${uni.env.USER_DATA_PATH}/${time}.${format}`
		fs.writeFile({
			filePath,
			data: base64.split(',')[1],
			encoding: 'base64',
			success() {
				resolve(filePath)
			},
			fail(err) {
				reject(err)
			},
		})
		// #endif
		// #ifdef APP-PLUS
		const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
		bitmap.loadBase64Data(
			base64,
			() => {
				if (!format) {
					reject(new Error('ERROR_BASE64SRC_PARSE'))
				}
				const time = new Date().getTime()
				const filePath = `_doc/uniapp_temp/${time}.${format}`
				bitmap.save(
					filePath,
					{},
					() => {
						bitmap.clear()
						resolve(filePath)
					},
					(error) => {
						bitmap.clear()
						reject(error)
					}
				)
			},
			(error) => {
				bitmap.clear()
				reject(error)
			}
		)
		// #endif
	})
}

export function sleep(delay) {
	return new Promise((resolve) => setTimeout(resolve, delay))
}

export function getRect(selector, options = {}) {
	const typeDefault = 'boundingClientRect'
	const { context, type = typeDefault } = options
	return new Promise((resolve, reject) => {
		const dom = uni.createSelectorQuery().in(context).select(selector)
		const result = (rect) => {
			if (rect) {
				resolve(rect)
			} else {
				reject()
			}
		}
		if (type == typeDefault) {
			dom[type](result).exec()
		} else {
			dom[type](
				{
					node: true,
					size: true,
					rect: true,
				},
				result
			).exec()
		}
	})
}
